<html>
    <head>
        <title>数据库映射</title>
    </head>
    <body>
        <script>
            /*
                        四、数据库映射

                                对于关系数据库，所有扩展属性值都存储在表中的单个字段中：

                                ExtraProperties字段将属性存储为JSON对象。
                                
                                虽然这在某些情况下很好，但你可能希望为你的新属性创建一个专用字段。

                                幸运的是，它很容易配置。

                                如果你使用的是Entity Framework Core数据库提供程序，你可以配置数据库映射，如下所示：

                                        ObjectExtensionManager.Instance
                                                              .MapEfCoreProperty<IdentityUser, string>(  // 配置扩展属性的数据库映射
                                                                    "SocialSecurityNumber",
                                                                    (entityBuilder, propertyBuilder) =>
                                                                    {
                                                                        propertyBuilder.HasMaxLength(64);
                                                                    }
                                                              );

                                在.EntityFrameworkCore项目中的YourProjectNameEfCoreEntityExtensionMappings类中写入此内容。

                                然后，你需要使用标准的Add-Migration和Update-Database命令来创建新的数据库迁移并将更改应用到你的数据库。

                                添加迁移创建一个新的迁移，如下所示：

                                        public partial class Added_SocialSecurityNumber_To_IdentityUser : Migration
                                        {
                                            protected override void Up(MigrationBuilder migrationBuilder)
                                            {
                                                migrationBuilder.AddColumn<string>(
                                                    name: "SocialSecurityNumber",
                                                    table: "AbpUsers",
                                                    maxLength: 128,
                                                    nullable: true);
                                            }

                                            protected override void Down(MigrationBuilder migrationBuilder)
                                            {
                                                migrationBuilder.DropColumn(
                                                    name: "SocialSecurityNumber",
                                                    table: "AbpUsers");
                                            }
                                        }
                                            
                                更新数据库后，你将看到AbpUsers表具有作为标准表字段的新属性：

                                备注：
                                     如果你首先创建了一个没有数据库表字段的属性，然后你需要将此属性移动到数据库表字段，建议在迁移中执行SQL命令以将旧值复制到新字段。

                                     但是，如果你没有成功，ABP会无缝管理它。它使用新的数据库字段，但如果为空，则回退到ExtraProperties字段。

                                     当你保存实体时，它会将值移动到新字段中。
                    */
        </script>
    </body>

</html>